package com.mybase.app.fourBase;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteQueryBuilder;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;
import android.text.TextUtils;

import java.util.HashMap;

/**
 * Created by happy_000 on 2014/12/10.
 *ContentProvider的实现过程:
 * 1>定义一个CONTENT_URI常量，提供了访问ContentProvider的标识符。
 *例:  public static final Uri CONTENT_URI = Uri.parse("content://com.example.codelab.transportationprovider");
 其中：content是协议 Com.exmaple.codelab.transportationprovider是类名，包含完整的包名。 Uri.parse将一个字符串转换成Uri类型。 如果Provider包含子表，同样定义包含字表的CONTENT_URI。
 * 2>定义一个类，继承ContentProvider。
 * 3>实现query,insert,update,delete,getType和onCreate方法。
 * 4>在AndroidManifest.xml当中进行声明。
 *
 *
 *
 */
public class MyProvider extends ContentProvider {
    // 当别的程序来访问这个ContentProvider，是通过Uri来访问的，UriMatcher检查是否符合标准
    // 给uri起一个规则，返回数字
    public static final UriMatcher uriMatcher;
    // 下面定义两个规则
    public static final int INCOMING_USER_COLLECTION = 1;
    public static final int INCOMING_USER_SINGLE = 2;
    static {//下面的users前面不能加/
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(ProviderData.AUTHORITY, "users",
                INCOMING_USER_COLLECTION);
        uriMatcher.addURI(ProviderData.AUTHORITY, "users/#",
                INCOMING_USER_SINGLE);
    }

    //有点类似于sql里面表的别名，这个也是给列其别名，必须要用
    //列的别名还是原来的名，没必要修改
    public static HashMap<String,String> userProjectionMap;
    static{
        userProjectionMap = new HashMap<String,String>();
        userProjectionMap.put(ProviderData.UserTableMetaData._ID, ProviderData.UserTableMetaData._ID );
        userProjectionMap.put(ProviderData.UserTableMetaData.USER_NAME, ProviderData.UserTableMetaData.USER_NAME);
    }

    private DatabaseHelper dh;

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODOAuto-generated method stub
        System.out.println("delete");
        return 0;
    }

    // 根据传入的URI，返回该URI所表示的数据类型
    // 也就是说，我们通过URI要访问的数据，返回什么类型
    @Override
    public String getType(Uri uri) {
        // TODOAuto-generated method stub
        System.out.println("getType");
        switch (uriMatcher.match(uri)) {
            case INCOMING_USER_COLLECTION:
                // UserTableMetaData是ProviderData的内部类
                return ProviderData.UserTableMetaData.CONTENT_TYPE;
            case INCOMING_USER_SINGLE:
                return ProviderData.UserTableMetaData.CONTENT_TYPE_ITEM;
            default:
                throw new IllegalArgumentException("Unknown uri" + uri);
        }
    }


    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODOAuto-generated method stub
        System.out.println("insert");
        SQLiteDatabase db = dh.getWritableDatabase();
        //返回表中自动增长的列的值，否则返回-1
        long rowId = db.insert(ProviderData.UserTableMetaData.TABLE_NAME,null, values);
        if(rowId>0){
            //将rowId追加到后面
            //contentUris：用来处理Uri的工具类
            Uri insertedUserUri = ContentUris.withAppendedId(ProviderData.UserTableMetaData.CONTENT_URI, rowId);
            //通知监听器，数据已经改变
            getContext().getContentResolver().notifyChange(insertedUserUri, null);
            return insertedUserUri;
        }
        throw new SQLException("Failed to insert row into "+uri);
    }

    //是一个回调方法，所以说在ContentProvider创建的时候执行
    //也就是创建这个DatabaseHelper对象
    @Override
    public boolean onCreate() {
        // TODOAuto-generated method stub
        //getContext得到当前正在运行着的context
        dh = new DatabaseHelper(getContext(),ProviderData.DATABASE_NAME);
        System.out.println("on create");
        SQLiteDatabase db = dh.getReadableDatabase();
        return true;
    }

    //projection：查询的列有哪些
    //selection:where子句的内容，可以用?
    //selectionArgs:占位符对应的参数
    //sortOrder:排序
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        // TODOAuto-generated method stub
        System.out.println("query");
        //创建一个查询的语句
        SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
        switch(uriMatcher.match(uri)){
            case INCOMING_USER_COLLECTION:
                //设置查询哪张表
                qb.setTables(ProviderData.UserTableMetaData.TABLE_NAME);
                qb.setProjectionMap(userProjectionMap);
                break;
            case INCOMING_USER_SINGLE:
                qb.setTables(ProviderData.UserTableMetaData.TABLE_NAME);
                qb.setProjectionMap(userProjectionMap);
                //添加where条件，getPathSegments：得到uri的path部分content:XXX/user/1，get(1)得到1
                qb.appendWhere(ProviderData.UserTableMetaData._ID+"="+uri.getPathSegments().get(1));
                break;
        }

        String orderBy;
        if(TextUtils.isEmpty(sortOrder)){
            orderBy = ProviderData.UserTableMetaData.DEFAULT_SORT_ORDER;
        }
        else
        {
            orderBy = sortOrder;
        }
        SQLiteDatabase db = dh.getWritableDatabase();
        //下面的query使用qb这个对象
        Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
        //也是通知下
        c.setNotificationUri(getContext().getContentResolver(), uri);
        System.out.println("query");
        return c;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                      String[] selectionArgs) {
        // TODOAuto-generated method stub
        return 0;
    }

}
